// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({ tabSize: 4 }, 'textile');
  function MT(name) {
    test.mode(name, mode, Array.prototype.slice.call(arguments, 1));
  }

  MT('simpleParagraphs', 'Some text.', '', 'Some more text.');

  /*
   * Phrase Modifiers
   */

  MT('em', 'foo [em _bar_]');

  MT('emBoogus', 'code_mirror');

  MT('strong', 'foo [strong *bar*]');

  MT('strongBogus', '3 * 3 = 9');

  MT('italic', 'foo [em __bar__]');

  MT('italicBogus', 'code__mirror');

  MT('bold', 'foo [strong **bar**]');

  MT('boldBogus', '3 ** 3 = 27');

  MT('simpleLink', '[link "CodeMirror":http://codemirror.net]');

  MT(
    'referenceLink',
    '[link "CodeMirror":code_mirror]',
    'Normal Text.',
    '[link [[code_mirror]]http://codemirror.net]',
  );

  MT('footCite', 'foo bar[qualifier [[1]]]');

  MT('footCiteBogus', 'foo bar[[1a2]]');

  MT(
    'special-characters',
    'Registered [tag (r)], ' +
      'Trademark [tag (tm)], and ' +
      'Copyright [tag (c)] 2008',
  );

  MT('cite', 'A book is [keyword ??The Count of Monte Cristo??] by Dumas.');

  MT(
    'additionAndDeletion',
    'The news networks declared [negative -Al Gore-] ' +
      '[positive +George W. Bush+] the winner in Florida.',
  );

  MT('subAndSup', 'f(x, n) = log [builtin ~4~] x [builtin ^n^]');

  MT('spanAndCode', 'A [quote %span element%] and [atom @code element@]');

  MT('spanBogus', 'Percentage 25% is not a span.');

  MT('citeBogus', 'Question? is not a citation.');

  MT('codeBogus', 'user@example.com');

  MT('subBogus', '~username');

  MT('supBogus', 'foo ^ bar');

  MT('deletionBogus', '3 - 3 = 0');

  MT('additionBogus', '3 + 3 = 6');

  MT('image', 'An image: [string !http://www.example.com/image.png!]');

  MT(
    'imageWithAltText',
    'An image: [string !http://www.example.com/image.png (Alt Text)!]',
  );

  MT(
    'imageWithUrl',
    'An image: [string !http://www.example.com/image.png!:http://www.example.com/]',
  );

  /*
   * Headers
   */

  MT('h1', '[header&header-1 h1. foo]');

  MT('h2', '[header&header-2 h2. foo]');

  MT('h3', '[header&header-3 h3. foo]');

  MT('h4', '[header&header-4 h4. foo]');

  MT('h5', '[header&header-5 h5. foo]');

  MT('h6', '[header&header-6 h6. foo]');

  MT('h7Bogus', 'h7. foo');

  MT(
    'multipleHeaders',
    '[header&header-1 h1. Heading 1]',
    '',
    'Some text.',
    '',
    '[header&header-2 h2. Heading 2]',
    '',
    'More text.',
  );

  MT(
    'h1inline',
    '[header&header-1 h1. foo ][header&header-1&em _bar_][header&header-1  baz]',
  );

  /*
   * Lists
   */

  MT('ul', 'foo', 'bar', '', '[variable-2 * foo]', '[variable-2 * bar]');

  MT('ulNoBlank', 'foo', 'bar', '[variable-2 * foo]', '[variable-2 * bar]');

  MT('ol', 'foo', 'bar', '', '[variable-2 # foo]', '[variable-2 # bar]');

  MT('olNoBlank', 'foo', 'bar', '[variable-2 # foo]', '[variable-2 # bar]');

  MT(
    'ulFormatting',
    '[variable-2 * ][variable-2&em _foo_][variable-2  bar]',
    '[variable-2 * ][variable-2&strong *][variable-2&em&strong _foo_]' +
      '[variable-2&strong *][variable-2  bar]',
    '[variable-2 * ][variable-2&strong *foo*][variable-2  bar]',
  );

  MT(
    'olFormatting',
    '[variable-2 # ][variable-2&em _foo_][variable-2  bar]',
    '[variable-2 # ][variable-2&strong *][variable-2&em&strong _foo_]' +
      '[variable-2&strong *][variable-2  bar]',
    '[variable-2 # ][variable-2&strong *foo*][variable-2  bar]',
  );

  MT(
    'ulNested',
    '[variable-2 * foo]',
    '[variable-3 ** bar]',
    '[keyword *** bar]',
    '[variable-2 **** bar]',
    '[variable-3 ** bar]',
  );

  MT(
    'olNested',
    '[variable-2 # foo]',
    '[variable-3 ## bar]',
    '[keyword ### bar]',
    '[variable-2 #### bar]',
    '[variable-3 ## bar]',
  );

  MT(
    'ulNestedWithOl',
    '[variable-2 * foo]',
    '[variable-3 ## bar]',
    '[keyword *** bar]',
    '[variable-2 #### bar]',
    '[variable-3 ** bar]',
  );

  MT(
    'olNestedWithUl',
    '[variable-2 # foo]',
    '[variable-3 ** bar]',
    '[keyword ### bar]',
    '[variable-2 **** bar]',
    '[variable-3 ## bar]',
  );

  MT(
    'definitionList',
    '[number - coffee := Hot ][number&em _and_][number  black]',
    '',
    'Normal text.',
  );

  MT(
    'definitionListSpan',
    '[number - coffee :=]',
    '',
    '[number Hot ][number&em _and_][number  black =:]',
    '',
    'Normal text.',
  );

  MT(
    'boo',
    '[number - dog := woof woof]',
    '[number - cat := meow meow]',
    '[number - whale :=]',
    '[number Whale noises.]',
    '',
    '[number Also, ][number&em _splashing_][number . =:]',
  );

  /*
   * Attributes
   */

  MT(
    'divWithAttribute',
    '[punctuation div][punctuation&attribute (#my-id)][punctuation . foo bar]',
  );

  MT(
    'divWithAttributeAnd2emRightPadding',
    '[punctuation div][punctuation&attribute (#my-id)((][punctuation . foo bar]',
  );

  MT(
    'divWithClassAndId',
    '[punctuation div][punctuation&attribute (my-class#my-id)][punctuation . foo bar]',
  );

  MT('paragraphWithCss', 'p[attribute {color:red;}]. foo bar');

  MT('paragraphNestedStyles', 'p. [strong *foo ][strong&em _bar_][strong *]');

  MT('paragraphWithLanguage', 'p[attribute [[fr]]]. Parlez-vous français?');

  MT('paragraphLeftAlign', 'p[attribute <]. Left');

  MT('paragraphRightAlign', 'p[attribute >]. Right');

  MT('paragraphRightAlign', 'p[attribute =]. Center');

  MT('paragraphJustified', 'p[attribute <>]. Justified');

  MT('paragraphWithLeftIndent1em', 'p[attribute (]. Left');

  MT('paragraphWithRightIndent1em', 'p[attribute )]. Right');

  MT('paragraphWithLeftIndent2em', 'p[attribute ((]. Left');

  MT('paragraphWithRightIndent2em', 'p[attribute ))]. Right');

  MT('paragraphWithLeftIndent3emRightIndent2em', 'p[attribute ((())]. Right');

  MT(
    'divFormatting',
    '[punctuation div. ][punctuation&strong *foo ]' +
      '[punctuation&strong&em _bar_][punctuation&strong *]',
  );

  MT(
    'phraseModifierAttributes',
    'p[attribute (my-class)]. This is a paragraph that has a class and' +
      ' this [em _][em&attribute (#special-phrase)][em emphasized phrase_]' +
      ' has an id.',
  );

  MT(
    'linkWithClass',
    '[link "(my-class). This is a link with class":http://redcloth.org]',
  );

  /*
   * Layouts
   */

  MT(
    'paragraphLayouts',
    'p. This is one paragraph.',
    '',
    'p. This is another.',
  );

  MT('div', '[punctuation div. foo bar]');

  MT('pre', '[operator pre. Text]');

  MT('bq.', '[bracket bq. foo bar]', '', 'Normal text.');

  MT('footnote', '[variable fn123. foo ][variable&strong *bar*]');

  /*
   * Spanning Layouts
   */

  MT(
    'bq..ThenParagraph',
    '[bracket bq.. foo bar]',
    '',
    '[bracket More quote.]',
    'p. Normal Text',
  );

  MT(
    'bq..ThenH1',
    '[bracket bq.. foo bar]',
    '',
    '[bracket More quote.]',
    '[header&header-1 h1. Header Text]',
  );

  MT(
    'bc..ThenParagraph',
    '[atom bc.. # Some ruby code]',
    '[atom obj = {foo: :bar}]',
    '[atom puts obj]',
    '',
    '[atom obj[[:love]] = "*love*"]',
    '[atom puts obj.love.upcase]',
    '',
    'p. Normal text.',
  );

  MT(
    'fn1..ThenParagraph',
    '[variable fn1.. foo bar]',
    '',
    '[variable More.]',
    'p. Normal Text',
  );

  MT(
    'pre..ThenParagraph',
    '[operator pre.. foo bar]',
    '',
    '[operator More.]',
    'p. Normal Text',
  );

  /*
   * Tables
   */

  MT(
    'table',
    '[variable-3&operator |_. name |_. age|]',
    '[variable-3 |][variable-3&strong *Walter*][variable-3 |   5  |]',
    '[variable-3 |Florence|   6  |]',
    '',
    'p. Normal text.',
  );

  MT(
    'tableWithAttributes',
    '[variable-3&operator |_. name |_. age|]',
    '[variable-3 |][variable-3&attribute /2.][variable-3  Jim |]',
    '[variable-3 |][variable-3&attribute \\2{color: red}.][variable-3  Sam |]',
  );

  /*
   * HTML
   */

  MT(
    'html',
    '[comment <div id="wrapper">]',
    '[comment <section id="introduction">]',
    '',
    '[header&header-1 h1. Welcome]',
    '',
    '[variable-2 * Item one]',
    '[variable-2 * Item two]',
    '',
    '[comment <a href="http://example.com">Example</a>]',
    '',
    '[comment </section>]',
    '[comment </div>]',
  );

  MT(
    'inlineHtml',
    'I can use HTML directly in my [comment <span class="youbetcha">Textile</span>].',
  );

  /*
   * No-Textile
   */

  MT('notextile', '[string-2 notextile. *No* formatting]');

  MT(
    'notextileInline',
    'Use [string-2 ==*asterisks*==] for [strong *strong*] text.',
  );

  MT('notextileWithPre', '[operator pre. *No* formatting]');

  MT(
    'notextileWithSpanningPre',
    '[operator pre.. *No* formatting]',
    '',
    '[operator *No* formatting]',
  );

  /* Only toggling phrases between non-word chars. */

  MT('phrase-in-word', 'foo_bar_baz');

  MT(
    'phrase-non-word',
    '[negative -x-] aaa-bbb ccc-ddd [negative -eee-] fff [negative -ggg-]',
  );

  MT('phrase-lone-dash', 'foo - bar - baz');
})();
